package com.smart.util;

import jxl.write.*;
import jxl.Workbook;
import java.io.File;
import java.util.Map;
import java.util.Set;
import java.util.List;
import jxl.SheetSettings;
import jxl.format.Border;
import jxl.format.Alignment;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.io.FileOutputStream;
import jxl.format.BorderLineStyle;
import jxl.format.VerticalAlignment;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletResponse;

/**
 * Excel导入导出工具类
 **/
public class ExportExcelUtils {

	//私有化构造函数
	private ExportExcelUtils() {}

	/**
	 * 导出EXCEL
	 * @param response
	 * @param fileName EXCEL文件名称
	 * @param titles   EXCEL文件第一行列标题集合
	 * @param data     EXCEL文件正文数据集合
	 * @return
	 **/
	public final static void exportExcel(HttpServletResponse response,
										 String fileName, String[] titles, List<Object> data) {
		// 以下开始输出到EXCEL
		try {
			OutputStream os = response.getOutputStream();// 取得输出流
			response.reset();// 清空输出流
			response.setHeader("Content-disposition", "attachment; filename="
				+ new String(fileName.getBytes("GB2312"), "ISO8859-1"));
			// 设定输出文件头
			response.setContentType("application/msexcel");// 定义输出类型
			/** **********创建工作簿************ */
			WritableWorkbook workbook = Workbook.createWorkbook(os);
			/** **********创建工作表************ */
			WritableSheet sheet = workbook.createSheet("Sheet1", 0);
			/** **********设置纵横打印（默认为纵打）、打印纸***************** */
			SheetSettings sheetset = sheet.getSettings();
			sheetset.setProtected(false);
			/** ************设置单元格字体************** */
			WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
			WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10,
				WritableFont.BOLD);
			/** ************以下设置三种单元格样式，灵活备用************ */
			// 用于标题居中
			WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);
			wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
			wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
			wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐
			wcf_center.setWrap(false); // 文字是否换行
			// 用于正文居左
			WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
			wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN); // 线条
			wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
			wcf_left.setAlignment(Alignment.LEFT); // 文字水平对齐
			wcf_left.setWrap(false); // 文字是否换行
			/** ***************以下是EXCEL第一行列标题********************* */
			for (int i = 0; i < titles.length; i++) {
				sheet.addCell(new Label(i, 0, titles[i], wcf_center));
			}
			/** ***************以下是EXCEL正文数据********************* */
			Field[] fields = null;
			int i = 1;
			if (data != null) {
				for (Object obj : data) {
					fields = obj.getClass().getDeclaredFields();
					int j = 0;
					for (Field v : fields) {
						v.setAccessible(true);
						Object va = v.get(obj);
						if (va == null) {
							va = "";
						}
						sheet.addCell(new Label(j, i, va.toString(), wcf_left));
						j++;
					}
					i++;
				}
			}
			/** **********将以上缓存中的内容写到EXCEL文件中******** */
			workbook.write();
			/** *********关闭文件************* */
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 导出EXCEL
	 * @param response
	 * @param fileName    EXCEL文件名称
	 * @param listContent 数据集合
	 * @return
	 **/
	public final static void exportExcelByMaps(HttpServletResponse response,
											   String fileName, List<Map<String, Object>> listContent) {
		// 以下开始输出到EXCEL
		try {
			// 定义输出流，以便打开保存对话框______________________begin
			OutputStream os = response.getOutputStream();// 取得输出流
			response.reset();// 清空输出流
			response.setHeader("Content-disposition", "attachment; filename="
				+ new String(fileName.getBytes("GB2312"), "ISO8859-1"));
			// 设定输出文件头
			response.setContentType("application/msexcel");// 定义输出类型
			// 定义输出流，以便打开保存对话框_______________________end
			/** **********创建工作簿************ */
			WritableWorkbook workbook = Workbook.createWorkbook(os);
			/** **********创建工作表************ */
			WritableSheet sheet = workbook.createSheet("Sheet1", 0);
			/** **********设置纵横打印（默认为纵打）、打印纸***************** */
			SheetSettings sheetset = sheet.getSettings();
			sheetset.setProtected(false);
			/** ************设置单元格字体************** */
			WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
			WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10,
				WritableFont.BOLD);
			/** ************以下设置三种单元格样式，灵活备用************ */
			// 用于标题居中
			WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);
			wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
			wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
			wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐
			wcf_center.setWrap(false); // 文字是否换行
			// 用于正文居左
			WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
			wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN); // 线条
			wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
			wcf_left.setAlignment(Alignment.LEFT); // 文字水平对齐
			wcf_left.setWrap(false); // 文字是否换行
			/** ***************以下是EXCEL开头大标题，暂时省略********************* */
			// sheet.mergeCells(0, 0, colWidth, 0);
			// sheet.addCell(new Label(0, 0, "XX报表", wcf_center));
			/** ***************以下是EXCEL第一行列标题********************* */
			if (listContent.size() > 0) {
				Map<String, Object> title = listContent.get(0);
				int n = 0;
				for (String key : title.keySet()) {
					sheet.addCell(new Label(n, 0, key, wcf_center));
					n++;
				}
				/** ***************以下是EXCEL正文数据********************* */
				int i = 1;
				for (Map<String, Object> obj : listContent) {
					Set<String> keys = obj.keySet();
					int j = 0;
					for (String key : keys) {
						Object va = obj.get(key);
						if (va == null) {
							va = "";
						}
						sheet.addCell(new Label(j, i, va.toString(), wcf_left));
						j++;
					}
					i++;
				}
				/** **********将以上缓存中的内容写到EXCEL文件中******** */
				workbook.write();
				/** *********关闭文件************* */
				workbook.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param fileName  导出文件名称,如:abc.xls
	 * @param objData   导出内容集合
	 * @param sheetName 导出工作表的名称
	 * @param columns   导出Excel的表头数组
	 * @return 1成功 0失败
	 **/
	public static int exportToExcel(String fileName, List<LinkedHashMap<String, Object>> objData, String sheetName, List<String> columns) {
		int flag = 1;
		//声明工作簿jxl.write.WritableWorkbook
		WritableWorkbook wwb;
		try {
			//根据传进来的file对象创建可写入的Excel工作薄
			OutputStream os = new FileOutputStream(new File(fileName));
			wwb = Workbook.createWorkbook(os);
			/*
			 * 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
			 * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
			 * 代码中的"0"就是sheet1、其它的一一对应。
			 * createSheet(sheetName, 0)一个是工作表的名称，另一个是工作表在工作薄中的位置
			 */
			WritableSheet ws = wwb.createSheet(sheetName, 0);
			SheetSettings ss = ws.getSettings();
			ss.setVerticalFreeze(1);//冻结表头
			WritableFont font1 = new WritableFont(WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD);
			WritableFont font2 = new WritableFont(WritableFont.createFont("微软雅黑"), 9, WritableFont.NO_BOLD);
			WritableCellFormat wcf = new WritableCellFormat(font1);
			WritableCellFormat wcf2 = new WritableCellFormat(font2);
			WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式，字体
			//创建单元格样式
			//WritableCellFormat wcf = new WritableCellFormat();
			//背景颜色
			wcf.setBackground(Colour.YELLOW);
			wcf.setAlignment(Alignment.CENTRE);  //平行居中
			wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			wcf3.setAlignment(Alignment.CENTRE);  //平行居中
			wcf3.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			wcf3.setBackground(Colour.LIGHT_ORANGE);
//            wcf2.setAlignment(Alignment.CENTRE);  //平行居中
			wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			/*
			 * 这个是单元格内容居中显示
			 * 还有很多很多样式
			 */
			wcf.setAlignment(Alignment.CENTRE);
			//判断一下表头数组是否有数据
			if (columns != null && columns.size() > 0) {
				//循环写入表头
				for (int i = 0; i < columns.size(); i++) {
					/*
					 * 添加单元格(Cell)内容addCell()
					 * 添加Label对象Label()
					 * 数据的类型有很多种、在这里你需要什么类型就导入什么类型
					 * 如：jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
					 * Label(i, 0, columns[i], wcf)
					 * 其中i为列、0为行、columns[i]为数据、wcf为样式
					 * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
					 */
					ws.addCell(new Label(i, 0, columns.get(i), wcf));
				}
				//判断表中是否有数据
				if (objData != null && objData.size() > 0) {
					//循环写入表中数据
					for (int i = 0; i < objData.size(); i++) {
						//转换成map集合{activyName:测试功能,count:2}
						Map<String, Object> map = (Map<String, Object>) objData.get(i);
						//循环输出map中的子集：既列值
						int j = 0;
						for (Object o : map.keySet()) {
							System.out.println(map.get(o));
							//ps：因为要“”通用”“导出功能，所以这里循环的时候不是get("Name"),而是通过map.get(o)
							ws.addCell(new Label(j, i + 1, String.valueOf(map.get(o) == null ? "" : map.get(o)), wcf2));
							j++;
						}
					}
				} else {
					flag = 0;
				}
				//写入Exel工作表
				wwb.write();
				//关闭Excel工作薄对象
				wwb.close();
				//关闭流
				os.flush();
				os.close();
				os = null;
			}
		} catch (IllegalStateException e) {
			flag = 0;
			e.printStackTrace();
		} catch (Exception ex) {
			flag = 0;
			ex.printStackTrace();
		}
		return flag;
	}

	/**
	 * @param objData   导出内容数组
	 * @param sheetName 导出工作表的名称
	 * @param columns   导出Excel的表头数组
	 * @return
	 **/
	public static int exportToExcel(HttpServletResponse response, List<LinkedHashMap<String, Object>> objData, String sheetName, List<String> columns) {
		int flag = 1;
		//声明工作簿jxl.write.WritableWorkbook
		WritableWorkbook wwb;
		try {
			//根据传进来的file对象创建可写入的Excel工作薄
			OutputStream os = response.getOutputStream();
			wwb = Workbook.createWorkbook(os);
			/*
			 * 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
			 * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
			 * 代码中的"0"就是sheet1、其它的一一对应。
			 * createSheet(sheetName, 0)一个是工作表的名称，另一个是工作表在工作薄中的位置
			 */
			WritableSheet ws = wwb.createSheet(sheetName, 0);
			SheetSettings ss = ws.getSettings();
			ss.setVerticalFreeze(1);//冻结表头
			WritableFont font1 = new WritableFont(WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD);
			WritableFont font2 = new WritableFont(WritableFont.createFont("微软雅黑"), 9, WritableFont.NO_BOLD);
			WritableCellFormat wcf = new WritableCellFormat(font1);
			WritableCellFormat wcf2 = new WritableCellFormat(font2);
			WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式，字体
			//创建单元格样式
			//WritableCellFormat wcf = new WritableCellFormat();
			//背景颜色
			wcf.setBackground(Colour.SEA_GREEN);
			wcf.setAlignment(Alignment.CENTRE);  //平行居中
			wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			wcf3.setAlignment(Alignment.CENTRE);  //平行居中
			wcf3.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			wcf3.setBackground(Colour.LIGHT_ORANGE);
//            wcf2.setAlignment(Alignment.CENTRE);  //平行居中
			wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			/*
			 * 这个是单元格内容居中显示
			 * 还有很多很多样式
			 */
			wcf.setAlignment(Alignment.CENTRE);
			//判断一下表头数组是否有数据
			if (columns != null && columns.size() > 0) {
				//循环写入表头
				for (int i = 0; i < columns.size(); i++) {
					/*
					 * 添加单元格(Cell)内容addCell()
					 * 添加Label对象Label()
					 * 数据的类型有很多种、在这里你需要什么类型就导入什么类型
					 * 如：jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
					 * Label(i, 0, columns[i], wcf)
					 * 其中i为列、0为行、columns[i]为数据、wcf为样式
					 * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
					 */
					ws.addCell(new Label(i, 0, columns.get(i), wcf));
				}
				//判断表中是否有数据
				if (objData != null && objData.size() > 0) {
					//循环写入表中数据
					int init = 0;//记录ID相同的最后一次记录
					for (int i = 0; i < objData.size(); i++) {
						//转换成map集合{activyName:测试功能,count:2}
						Map<String, Object> map = objData.get(i);
						//循环输出map中的子集：既列值
						int j = 0;
						for (Object o : map.keySet()) {
							//ps：因为要“”通用”“导出功能，所以这里循环的时候不是get("Name"),而是通过map.get(o)
							ws.addCell(new Label(j, i + 1, String.valueOf(map.get(o) == null ? "" : map.get(o)), wcf2));
							j++;
						}
						//合并单元格
//						if (i > 0) {
//							Map<String, Object> prev = (Map<String, Object>) objData.get(i - 1);
//							if (map.get("id").toString().equals(prev.get("id").toString())) {
//								if (i == objData.size() - 1) { //最后一条数据
//									for (int z = 0; z < 12; z++) { //合并单元格 (1列--12列)
//										ws.mergeCells(z, init + 1, z, i + 1);
//									}
//								}
//							} else {
//								for (int z = 0; z < 12; z++) {
//									ws.mergeCells(z, init + 1, z, i);
//								}
//								init = i;//记录i
//							}
//						}
					}
				} else {
					flag = 0;
				}
				//写入Exel工作表
				wwb.write();
				//关闭Excel工作薄对象
				wwb.close();
				//关闭流
				os.flush();
				os.close();
				os = null;
			}
		} catch (IllegalStateException e) {
			flag = 0;
			e.printStackTrace();
		} catch (Exception ex) {
			flag = 0;
			ex.printStackTrace();
		}
		return flag;
	}

	/**
	 * 下载excel
	 * @param response
	 * @param filename  文件名 ,如:abc.xls
	 * @param listData  数据源
	 * @param sheetName 表头名称
	 * @param columns   列名称集合,如：{物品名称，数量，单价}
	 * @author
	 **/
	public static void exportExcle(HttpServletResponse response, String filename, List<LinkedHashMap<String, Object>> listData, String sheetName, List<String> columns) {
		//调用上面的方法、生成Excel文件
		response.setContentType("application/vnd.ms-excel");
		//response.setHeader("Content-Disposition", "attachment;filename="+filename);
		try {
			response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");
			exportToExcel(response, listData, sheetName, columns);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	public static void exportExcles(HttpServletResponse response, String filename, List<Map<String, Object>> listData1, List<Map<String, Object>> listData2, String sheetName1, List<String> columns1, String sheetName2, List<String> columns2) {
		//调用上面的方法、生成Excel文件
		response.setContentType("application/vnd.ms-excel");
		//response.setHeader("Content-Disposition", "attachment;filename="+filename);
		try {
			response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");
			exportToExcels(response, listData1, listData2, sheetName1, columns1, sheetName2, columns2);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	public static int exportToExcels(HttpServletResponse response, List<Map<String, Object>> objData1, List<Map<String, Object>> objData2, String sheetName1, List<String> columns1, String sheetName2, List<String> columns2) {
		int flag = 1;
		//声明工作簿jxl.write.WritableWorkbook
		WritableWorkbook wwb;
		try {
			//根据传进来的file对象创建可写入的Excel工作薄
			OutputStream os = response.getOutputStream();
			wwb = Workbook.createWorkbook(os);
			/**
			 * 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
			 * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
			 * 代码中的"0"就是sheet1、其它的一一对应。
			 * createSheet(sheetName, 0)一个是工作表的名称，另一个是工作表在工作薄中的位置
			 **/
			WritableSheet ws = wwb.createSheet(sheetName1, 0);
			SheetSettings ss = ws.getSettings();
			ss.setVerticalFreeze(1);//冻结表头
			WritableSheet ws2 = wwb.createSheet(sheetName2, 1);
			SheetSettings ss2 = ws.getSettings();
			ss2.setVerticalFreeze(1);//冻结表头

			WritableFont font1 = new WritableFont(WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD);
			WritableFont font2 = new WritableFont(WritableFont.createFont("微软雅黑"), 9, WritableFont.NO_BOLD);
			WritableCellFormat wcf = new WritableCellFormat(font1);
			WritableCellFormat wcf2 = new WritableCellFormat(font2);
			WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式，字体
			//创建单元格样式
			//WritableCellFormat wcf = new WritableCellFormat();
			//背景颜色
			wcf.setBackground(Colour.YELLOW);
			wcf.setAlignment(Alignment.CENTRE);  //平行居中
			wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			wcf3.setAlignment(Alignment.CENTRE);  //平行居中
			wcf3.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			wcf3.setBackground(Colour.LIGHT_ORANGE);
//            wcf2.setAlignment(Alignment.CENTRE);  //平行居中
			wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
			/**
			 * 这个是单元格内容居中显示
			 * 还有很多很多样式
			 **/
			wcf.setAlignment(Alignment.CENTRE);

			if (columns2 != null && columns2.size() > 0) {
				//循环写入表头
				for (int i = 0; i < columns2.size(); i++) {
					/*
					 * 添加单元格(Cell)内容addCell()
					 * 添加Label对象Label()
					 * 数据的类型有很多种、在这里你需要什么类型就导入什么类型
					 * 如：jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
					 * Label(i, 0, columns[i], wcf)
					 * 其中i为列、0为行、columns[i]为数据、wcf为样式
					 * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
					 */
					ws2.addCell(new Label(i, 0, columns2.get(i), wcf));
				}
				//判断表中是否有数据
				if (objData2 != null && objData2.size() > 0) {
					//循环写入表中数据
					int init = 0;//记录ID相同的最后一次记录
					for (int i = 0; i < objData2.size(); i++) {
						//转换成map集合{activyName:测试功能,count:2}
						Map<String, Object> map = objData2.get(i);
						//循环输出map中的子集：既列值
						int j = 0;
						for (Object o : map.keySet()) {
							//ps：因为要“”通用”“导出功能，所以这里循环的时候不是get("Name"),而是通过map.get(o)
							ws2.addCell(new Label(j, i + 1, String.valueOf(map.get(o) == null ? "" : map.get(o)), wcf2));
							j++;
						}
						//合并单元格
						if (i > 0) {
							Map<String, Object> prev = (Map<String, Object>) objData2.get(i - 1);
							if (map.get("id").toString().equals(prev.get("id").toString())) {
								if (i == objData2.size() - 1) { //最后一条数据
									for (int z = 0; z < 12; z++) { //合并单元格 (1列--12列)
										ws2.mergeCells(z, init + 1, z, i + 1);
									}
								}
							} else {
								for (int z = 0; z < 12; z++) {
									ws2.mergeCells(z, init + 1, z, i);
								}
								init = i;//记录i
							}
						}
					}
				} else {
					flag = 0;
				}
			}

			//判断一下表头数组是否有数据
			if (columns1 != null && columns1.size() > 0) {
				//循环写入表头
				for (int i = 0; i < columns1.size(); i++) {
					/*
					 * 添加单元格(Cell)内容addCell()
					 * 添加Label对象Label()
					 * 数据的类型有很多种、在这里你需要什么类型就导入什么类型
					 * 如：jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
					 * Label(i, 0, columns[i], wcf)
					 * 其中i为列、0为行、columns[i]为数据、wcf为样式
					 * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
					 */
					ws.addCell(new Label(i, 0, columns1.get(i), wcf));
				}
				//判断表中是否有数据
				if (objData1 != null && objData1.size() > 0) {
					//循环写入表中数据
					int init = 0;//记录ID相同的最后一次记录
					for (int i = 0; i < objData1.size(); i++) {
						//转换成map集合{activyName:测试功能,count:2}
						Map<String, Object> map = objData1.get(i);
						//循环输出map中的子集：既列值
						int j = 0;
						for (Object o : map.keySet()) {
							//ps：因为要“”通用”“导出功能，所以这里循环的时候不是get("Name"),而是通过map.get(o)
							ws.addCell(new Label(j, i + 1, String.valueOf(map.get(o) == null ? "" : map.get(o)), wcf2));
							j++;
						}
						//合并单元格
						if (i > 0) {
							Map<String, Object> prev = (Map<String, Object>) objData1.get(i - 1);
							if (map.get("id").toString().equals(prev.get("id").toString())) {
								if (i == objData1.size() - 1) { //最后一条数据
									for (int z = 0; z < 12; z++) { //合并单元格 (1列--12列)
										ws.mergeCells(z, init + 1, z, i + 1);
									}
								}
							} else {
								for (int z = 0; z < 12; z++) {
									ws.mergeCells(z, init + 1, z, i);
								}
								init = i;//记录i
							}
						}
					}
				} else {
					flag = 0;
				}
			}
			//写入Exel工作表
			wwb.write();

			//关闭Excel工作薄对象
			wwb.close();
			//关闭流
			os.flush();
			os.close();
			os = null;
		} catch (IllegalStateException e) {
			flag = 0;
			e.printStackTrace();
		} catch (Exception ex) {
			flag = 0;
			ex.printStackTrace();
		}
		return flag;
	}

}